package com.itheima.ui;

import com.itheima.bean.Employee;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

public class EmployeeManageUI extends JFrame {
    private JTable table;                       // 表格实例
    private DefaultTableModel model;            // 表格模型实例
    private JTextField searchField;             // 搜索框实例
    private JButton searchButton, addButton;    // 搜索按钮和添加按钮实例
    private String username;                    // 当前登录的用户名

    //准备一个静态集合用于存储系统中的全部员工信息
    private static ArrayList<Employee> employees = new ArrayList<>();


    public EmployeeManageUI(String username) {
        this.username = username;

        initializeUI(); // 初始化用户界面

    }

    public EmployeeManageUI() {
    }

    private void initializeUI() {
        setTitle("欢迎 " + username + " 进入员工信息管理界面！"); // 设置窗口标题
        setSize(800, 700); // 设置窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口行为
        setLocationRelativeTo(null); // 设置窗口居中显示

        JPanel mainPanel = new JPanel(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 设置边框间距

        JPanel topPanel = createTopPanel(); // 创建顶部面板
        mainPanel.add(topPanel, BorderLayout.NORTH); // 将顶部面板添加到主面板的北面

        table = createTable(); // 创建表格
        mainPanel.add(new JScrollPane(table), BorderLayout.CENTER); // 将表格添加到滚动窗格，并添加到主面板的中心区域

        setupRowMenu(); // 设置右键菜单

        setContentPane(mainPanel); // 设置主面板为窗口的内容面板
        setVisible(true); // 显示窗口
    }

    private JPanel createTopPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER)); // 创建中心布局的面板

        searchField = new JTextField(25); // 创建搜索框，宽度为25列
        searchButton = new JButton("搜索"); // 创建搜索按钮
        addButton = new JButton("添加"); // 创建添加按钮

        searchButton.addActionListener(e -> {
            String query = searchField.getText();
            // 实现搜索逻辑
        });

        addButton.addActionListener(e -> {
            // 实现添加员工的逻辑
            new AddEmployeeUI(this);

        });

        panel.add(searchField); // 将搜索框添加到面板
        panel.add(searchButton); // 将搜索按钮添加到面板
        panel.add(addButton); // 将添加按钮添加到面板

        return panel; // 返回顶部面板
    }

    private JTable createTable() {
        model = new DefaultTableModel(
                new Object[]{"ID", "姓名", "年龄", "性别", "电话", "职位", "月薪", "所在部门"}, 0) { // 更新列标题
            @Override
            public boolean isCellEditable(int row, int column) {
                return false; // 表格中的单元格不允许编辑
            }
        };

        // 添加数据
        for (int i = 0; i < 20; i++) {
            model.addRow(new Object[]{i + 1, "员工" + (i + 1), 25 + i, "男", "13800000000", "开发人员", 50000, "技术部"}); // 更新数据结构
        }

        table = new JTable(model); // 创建表格实例
        table.setFillsViewportHeight(true); // 让表格填充滚动窗格的高度
        table.setRowHeight(30); // 增加行高
        table.setDefaultRenderer(Object.class, new CenteredRenderer()); // 使用居中显示的渲染器
        table.setFont(new Font("宋体", Font.PLAIN, 16)); // 设置表格字体大小

        // 设置标题栏的字体大小和行高
        JTableHeader header = table.getTableHeader();
        header.setFont(new Font("宋体", Font.BOLD, 16)); // 设置标题栏字体大小
        header.setReorderingAllowed(false); // 禁止重新排序列

        return table; // 返回表格实例
    }

    private void setupRowMenu() {
        JPopupMenu popupMenu = new JPopupMenu(); // 创建右键菜单

        JMenuItem editItem = new JMenuItem("编辑"); // 创建编辑菜单项
        JMenuItem deleteItem = new JMenuItem("删除"); // 创建删除菜单项

        // 编辑按钮事件处理
        editItem.addActionListener(e -> {
            int selectedRow = table.getSelectedRow(); // 获取选中的行
            if (selectedRow != -1) { // 如果有选中的行
                int id = (Integer) model.getValueAt(selectedRow, 0); // 获取该行的ID值
                // 弹出对话框让用户编辑员工信息
                JOptionPane.showMessageDialog(this,
                        "您选择了ID为 " + id + " 的员工进行编辑。",
                        "编辑员工信息",
                        JOptionPane.INFORMATION_MESSAGE);
                // 这里可以添加实际的编辑逻辑
            } else { // 如果没有选中的行
                JOptionPane.showMessageDialog(this,
                        "请选择一行进行编辑。",
                        "提示",
                        JOptionPane.WARNING_MESSAGE);
            }
        });

        // 删除按钮事件处理
        deleteItem.addActionListener(e -> {
            int selectedRow = table.getSelectedRow(); // 获取选中的行
            if (selectedRow != -1) { // 如果有选中的行
                int id = (Integer) model.getValueAt(selectedRow, 0); // 获取该行的ID值
                int result = JOptionPane.showConfirmDialog(this,
                        "确定要删除ID为 " + id + " 的员工吗？",
                        "确认删除",
                        JOptionPane.YES_NO_OPTION);
                if (result == JOptionPane.YES_OPTION) { // 如果用户确认删除
                    // 从模型中删除该行
                    deleteEmployee(id);
                    model.removeRow(selectedRow);

                }
            } else { // 如果没有选中的行
                JOptionPane.showMessageDialog(this,
                        "请选择一行进行删除。",
                        "提示",
                        JOptionPane.WARNING_MESSAGE);
            }
        });

        popupMenu.add(editItem); // 将编辑菜单项添加到右键菜单
        popupMenu.add(deleteItem); // 将删除菜单项添加到右键菜单

        table.addMouseListener(new MouseAdapter() { // 添加鼠标监听器
            @Override
            public void mouseReleased(MouseEvent e) { // 当鼠标释放时触发
                if (e.isPopupTrigger()) { // 如果是右键点击
                    int row = table.rowAtPoint(e.getPoint()); // 获取点击的位置对应的行
                    if (row != -1) { // 如果点击的是有效行
                        table.setRowSelectionInterval(row, row); // 选择该行
                        popupMenu.show(table, e.getX(), e.getY()); // 显示右键菜单
                    }
                }
            }
        });
    }

    private void deleteEmployee(int id) {
        //从集合中删除该员工对象
        employees.removeIf(employee -> employee.getId() == id);

    }

    public void addEmployee(Employee employee) {
        // 添加员工到集合，展示到表格
        employees.add(employee);
        // 更新表格
        model.addRow(new Object[]{employee.getId(), employee.getName(),
                employee.getAge(), employee.getGender(), employee.getPhone(),
                employee.getPosition(), employee.getSalary(), employee.getDepartment()});
        //弹出一个添加成功的提示
        JOptionPane.showMessageDialog(this, "添加成功！", "提示", JOptionPane.INFORMATION_MESSAGE);

    }

    // 自定义渲染器类，用于居中显示表格内容
    private static class CenteredRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            label.setHorizontalAlignment(SwingConstants.CENTER); // 居中文本
            return label;
        }
    }

    /*public static void main(String[] args) {
        SwingUtilities.invokeLater(EmployeeManage::new); // 在事件调度线程中创建窗口实例
    }*/
}